/* @flow */

import {isObject, isDef, hasSymbol} from 'core/util/index'

/**
 * Runtime helper for rendering v-for lists.
 */
export function renderList(
  val: any,
  render: (
    val: any,
    keyOrIndex: string | number,
    index?: number

) =>
VNode
):
  ? Array < VNode > {
  let ret : ? Array < VNode >, i, l, keys, key
if (Array.isArray(val) || typeof val === 'string') {
  ret = new Array(val.length)
  for (i = 0, l = val.length; i < l; i++) {
    ret[i] = render(val[i], i)
  }
} else if (typeof val === 'number') {
  ret = new Array(val)
  for (i = 0; i < val; i++) {
    ret[i] = render(i + 1, i)
  }
} else if (isObject(val)) {
  if (hasSymbol && val[Symbol.iterator]) {
    ret = []
    const iterator: Iterator<any> = val[Symbol.iterator]()
    let result = iterator.next()
    while (!result.done) {
      ret.push(render(result.value, ret.length))
      result = iterator.next()
    }
  } else {
    keys = Object.keys(val)
    ret = new Array(keys.length)
    for (i = 0, l = keys.length; i < l; i++) {
      key = keys[i]
      ret[i] = render(val[key], key, i)
    }
  }
}
if (!isDef(ret)) {
  ret = []
}
(ret: any)
.
_isVList = true
return ret
}
